import os
import random
import shutil
from turtledemo.penrose import start

import numpy as np
from moviepy import AudioFileClip, VideoFileClip
import pyJianYingDraft as draft

from combinations.config import OUTPUT_PATH, DRAFT_PATH
from combinations.conf import logger
from pyJianYingDraft import Font_type, trange, Text_style, Export_framerate, Export_resolution, Clip_settings, \
    Intro_type
import pandas as pd

from pyJianYingDraft.segment import Speed
from pyJianYingDraft.template_mode import Imported_media_track


# ==================== 工具函数 ====================

def load_files_from_dir(directory):
    """
    加载指定目录下的所有文件，并返回其全路径列表。

    Args:
        directory (str): 文件夹路径

    Returns:
        List[str]: 文件的全路径列表
    """
    logger.info(f"正在加载目录中的文件: {directory}")
    files = [os.path.join(directory, f) for f in os.listdir(directory)
             if os.path.isfile(os.path.join(directory, f))]
    logger.debug(f"共找到 {len(files)} 个文件")
    return files


def replace_video(script, image_files):
    """
    替换剪映模板中的视频素材。

    Args:
        script (draft.Script): 当前操作的脚本对象
        image_files (List[str]): 图片文件路径列表
    """
    logger.info("开始替换图片素材...")

    # 定义原始图片名称格式（图片_1.png ~ 图片_20.png）
    original_names = [f"labu ({i}).mp4" for i in range(1, 14)]

    # 遍历每张新图片进行替换
    for idx, image_file in enumerate(image_files):
        original_name = original_names[idx]
        new_material = draft.Video_material(image_file)

        # 替换素材并获取新的 material_id
        script, material_id = script.replace_material_by_name(
            material_name=original_name,
            material=new_material
        )
        logger.info(f"替换【视频】素材: {original_name} -> {image_file}")


    return script


# 定义一个函数来生成帧时间偏移
def randomize_frame_timing(duration, fps_base=24, jitter_ratio=0.05):
    """
    在固定总时长内，为每一帧添加轻微随机时间偏移。

    Args:
        duration (float): 视频总时长（秒）
        fps_base (int): 基础帧率
        jitter_ratio (float): 抖动比例（建议 0~0.1）

    Returns:
        list: 每帧对应的时间戳列表
    """
    total_frames = int(duration * fps_base)
    base_interval = 1.0 / fps_base
    times = []

    current_time = 0.0
    for _ in range(total_frames):
        interval_jitter = base_interval * (1 + np.random.uniform(-jitter_ratio, jitter_ratio))
        times.append(current_time)
        current_time += interval_jitter

    # 最后缩放时间轴，保证总长度与原视频一致
    scale_factor = duration / current_time
    times = [t * scale_factor for t in times]
    return times


def delete_old_draft(folder_path, combo_name):
    """
    删除历史草稿文件夹。

    Args:
        folder_path (str): 草稿所在基础路径
        combo_name (str): 要删除的草稿名
    """
    full_path = os.path.join(folder_path, combo_name)
    logger.info(f"尝试删除历史草稿: {full_path}")
    if os.path.exists(full_path):
        shutil.rmtree(full_path)
        logger.info(f"✅ 已删除文件夹: {full_path}")
    else:
        logger.warning(f"⚠️ 文件夹不存在: {full_path}")


# ==================== 主流程 ====================

def main():
    """
    主函数：批量生成剪映视频并导出
    """

    # 初始化剪映项目配置
    logger.info("初始化剪映草稿模板...")
    draft_folder = draft.Draft_folder(DRAFT_PATH)

    # 设置资源路径
    video_dir = r"D:\模板13_模特走秀\视频"
    base_folder = os.path.join(
        # LOCALAPPDATA 是 Windows 系统中的一个环境变量，表示当前用户的本地应用程序数据存储路径
        # C:\Users\<用户名>\AppData\Local
        os.getenv("LOCALAPPDATA"),
        "JianyingPro\\User Data\\Projects\\com.lveditor.draft"
    )

    # 加载资源文件
    logger.info("加载本地资源文件...")
    all_video_files = load_files_from_dir(video_dir)

    # 循环处理每条数据
    logger.info("开始批量生成视频任务...")
    start_ = 0
    end_ = 300
    for k in range(0, 300):
        try:
            k += start_
            combo_name = f"{k}_未来模特-卡点"

            logger.info(f"🚀 开始处理第 {k} 条任务")
        except  Exception as e:
            logger.error(f"数据处理失败: {e}", exc_info=True)
            continue

        # 创建脚本副本
        script = draft_folder.duplicate_as_template("模板13_模特走秀", combo_name, allow_replace=True)
        logger.info(f"创建草稿副本: {combo_name}")



        # 替换图片
        index_offset = (k % (len(all_video_files) - 4))  # 确保不越界
        video_files = all_video_files[index_offset:index_offset + 5]

        # video_files = random.sample(all_video_files, 4)
        tmp_script = replace_video(script, video_files)


        # 保存草稿
        # print(tmp_script.dumps())
        tmp_script.save()
        logger.info("✅ 草稿保存完成")

        # 导出视频
        logger.info("🎬 开始导出视频")
        ctrl = draft.Jianying_controller()
        export_folder = os.path.join(OUTPUT_PATH, "模板13_模特走秀")
        output_path = os.path.join(export_folder, f"{combo_name}.mp4")

        ctrl.export_draft(combo_name, output_path,
                          resolution=Export_resolution.RES_1080P,
                          framerate=Export_framerate.FR_24,
                          zi_mu=False,
                          kou_tu=False)
        logger.info(f"导出视频完成: {output_path}")


        # 删除旧草稿
        delete_old_draft(base_folder, combo_name)

        logger.info(f"✅ 第 {k} 条任务处理完成\n")

    logger.info("🎉 全部任务已完成！")


if __name__ == "__main__":
    main()
